package cn.cxq.learning.tree;

/**
 * 链接：https://www.nowcoder.com/questionTerminal/a9d0ecbacef9410ca97463e4a5c83be7?toCommentId=9140265
 * 来源：牛客网
 *
 * [编程题]二叉树的镜像
 * 热度指数：26493时间限制：C/C++ 1秒，其他语言2秒空间限制：C/C++ 256M，其他语言512M
 * 算法知识视频讲解
 * 操作给定的二叉树，将其变换为源二叉树的镜像。
 * 比如：    源二叉树
 *             8
 *            /  \
 *           6   10
 *          / \  / \
 *         5  7 9 11
 *         镜像二叉树
 *             8
 *            /  \
 *           10   6
 *          / \  / \
 *         11 9 7  5
 * 示例1
 * 输入
 * {8,6,10,5,7,9,11}
 * 输出
 * {8,10,6,11,9,7,5}
 */
public class BinaryTreeMirror {

    public TreeNode Mirror(TreeNode pRoot) {

        if (pRoot == null) {
            return pRoot;
        }
        // write code here
        TreeNode temp = new TreeNode(Integer.MIN_VALUE); // 用于交换用

        mirror(pRoot, temp);

        return pRoot;
    }

    //思路： 递归解决。
    private void mirror(TreeNode treeNode, TreeNode temp) {
        if (treeNode.left == null && treeNode.right == null) {
            return;
        }
        temp = treeNode.left;
        treeNode.left = treeNode.right;
        treeNode.right = temp;
        if (treeNode.left != null) {
            mirror(treeNode.left, temp);
        }
        if (treeNode.right!=null) {
            mirror(treeNode.right, temp);
        }
    }
}
